﻿using SlamDunk.ValueObjects.Enums;
using System;

namespace SlamDunk.MES.Domain.Entities.StockContext
{
    /// <summary>
    /// 出库单
    /// </summary>
    public class StockOutOrder : StockOrder
    {
        #region # 构造器

        #region 00.无参构造器
        /// <summary>
        /// 无参构造器
        /// </summary>
        protected StockOutOrder() { }
        #endregion

        #region 01.创建出库单构造器
        /// <summary>
        /// 创建出库单构造器
        /// </summary>
        /// <param name="orderNo">单据编号</param>
        /// <param name="orderName">单据名称</param>
        /// <param name="stockOrderClassId">库存单据类Id</param>
        /// <param name="sourceOrderType">源单据类型</param>
        /// <param name="sourceOrderId">源单据Id</param>
        /// <param name="sourceOrderName">源单据名称</param>
        /// <param name="sourceStorageLocationType">源储存位置类型</param>
        /// <param name="sourceStorageLocationId">源储存位置Id</param>
        /// <param name="sourceStorageLocationName">源储存位置名称</param>
        /// <param name="targetStorageLocationType">目标储存位置类型</param>
        /// <param name="targetStorageLocationId">目标储存位置Id</param>
        /// <param name="targetStorageLocationName">目标储存位置名称</param>
        /// <param name="facilityId">工厂模型Id</param>
        /// <param name="description">描述</param>
        public StockOutOrder(string orderNo, string orderName, Guid stockOrderClassId, SourceOrderType? sourceOrderType, string sourceOrderId, string sourceOrderName, StorageLocationType sourceStorageLocationType, string sourceStorageLocationId, string sourceStorageLocationName, StorageLocationType targetStorageLocationType, string targetStorageLocationId, string targetStorageLocationName, Guid? facilityId, string description)
            : base(orderNo, orderName, stockOrderClassId, StockDirectionType.Output, sourceOrderType, sourceOrderId, sourceOrderName, facilityId, description)
        {
            this.SourceStorageLocationType = sourceStorageLocationType;
            this.SourceStorageLocationId = sourceStorageLocationId;
            this.SourceStorageLocationName = sourceStorageLocationName;
            this.TargetStorageLocationType = targetStorageLocationType;
            this.TargetStorageLocationId = targetStorageLocationId;
            this.TargetStorageLocationName = targetStorageLocationName;
        }
        #endregion

        #endregion

        #region # 属性

        #region 源储存位置类型 —— StorageLocationType SourceStorageLocationType
        /// <summary>
        /// 源储存位置类型
        /// </summary>
        public StorageLocationType SourceStorageLocationType { get; private set; }
        #endregion

        #region 源储存位置Id —— string SourceStorageLocationId
        /// <summary>
        /// 源储存位置Id
        /// </summary>
        public string SourceStorageLocationId { get; private set; }
        #endregion

        #region 源储存位置名称 —— string SourceStorageLocationName
        /// <summary>
        /// 源储存位置名称
        /// </summary>
        public string SourceStorageLocationName { get; private set; }
        #endregion

        #region 目标储存位置类型 —— StorageLocationType TargetStorageLocationType
        /// <summary>
        /// 目标储存位置类型
        /// </summary>
        public StorageLocationType TargetStorageLocationType { get; private set; }
        #endregion

        #region 目标储存位置Id —— string TargetStorageLocationId
        /// <summary>
        /// 目标储存位置Id
        /// </summary>
        public string TargetStorageLocationId { get; private set; }
        #endregion

        #region 目标储存位置名称 —— string TargetStorageLocationName
        /// <summary>
        /// 目标储存位置名称
        /// </summary>
        public string TargetStorageLocationName { get; private set; }
        #endregion

        #endregion

        #region # 方法

        #region 修改出库单 —— void UpdateInfo(StorageLocationType sourceStorageLocationType...
        /// <summary>
        /// 修改出库单
        /// </summary>
        /// <param name="sourceStorageLocationType">源储存位置类型</param>
        /// <param name="sourceStorageLocationId">源储存位置Id</param>
        /// <param name="sourceStorageLocationName">源储存位置名称</param>
        /// <param name="targetStorageLocationType">目标储存位置类型</param>
        /// <param name="targetStorageLocationId">目标储存位置Id</param>
        /// <param name="targetStorageLocationName">目标储存位置名称</param>
        /// <param name="facilityId">工厂模型Id</param>
        /// <param name="description">描述</param>
        public void UpdateInfo(StorageLocationType sourceStorageLocationType, string sourceStorageLocationId, string sourceStorageLocationName, StorageLocationType targetStorageLocationType, string targetStorageLocationId, string targetStorageLocationName, Guid? facilityId, string description)

        {
            this.SourceStorageLocationType = sourceStorageLocationType;
            this.SourceStorageLocationId = sourceStorageLocationId;
            this.SourceStorageLocationName = sourceStorageLocationName;
            this.TargetStorageLocationType = targetStorageLocationType;
            this.TargetStorageLocationId = targetStorageLocationId;
            this.TargetStorageLocationName = targetStorageLocationName;

            base.UpdateInfo(facilityId, description);
        }
        #endregion

        #endregion
    }
}
